package testCases;

import common.InitAndCloseWith2Driver;
import org.junit.jupiter.api.*;
import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.util.List;
import java.util.concurrent.TimeUnit;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class AddFriendTest extends InitAndCloseWith2Driver {



    // zhangsan 添加 lisi 为好友
    private void addLisi() {
        // zhangsan 在搜索框搜索 lisi
        webDriver.findElement(By.cssSelector("#inputBox")).sendKeys(Keys.CONTROL, "a");
        webDriver.findElement(By.cssSelector("#inputBox")).sendKeys("lisi", Keys.ENTER);

        // 找到 lisi 的 li 中的添加按钮
        WebElement ul = webDriver.findElement(By.cssSelector("#add-friend"));
        List<WebElement> liList = ul.findElements(By.tagName("li"));
        WebElement addButton = null;

        for (int i = 1; i <= liList.size(); i++) {
            // 找到 li 下 <h4> 中的名字为 lisi
            String name = ((JavascriptExecutor) webDriver).executeScript(
                    "return document.querySelector(\"#add-friend > li:nth-child(" + i + ") > h4\").innerText;"
            ).toString();
            if (name.equals("lisi")) {
                addButton = liList.get(i - 1).findElement(By.tagName("button"));
                break;
            }
        }

        // 点击添加按钮, 如果没有搜索按钮, 测试不通过
        if (addButton == null) {
            Assertions.fail("没有发现搜索按钮");
        }
        addButton.click();
        webDriver.findElement(By.cssSelector("#addFriendBtn")).click();

        // 显示等待
        WebDriverWait wait = new WebDriverWait(webDriver, 3);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#add-friend > li > h3")));

        // h3 标签显示为 等待对方接受
        ul = webDriver.findElement(By.cssSelector("#add-friend"));
        liList = ul.findElements(By.tagName("li"));
        String info = null;
        for (int i = 1; i <= liList.size(); i++) {
            // 找到 li 下 <h4> 中的名字为 lisi
            String name = ((JavascriptExecutor) webDriver).executeScript(
                    "return document.querySelector(\"#add-friend > li:nth-child(" + i + ") > h4\").innerText;"
            ).toString();
            if (name.equals("lisi")) {
                info = ((JavascriptExecutor) webDriver)
                        .executeScript("return arguments[0].querySelector('h3').textContent;", liList.get(i - 1))
                        .toString();
                break;
            }
        }

        assert info != null;
        if (!info.equals("等待对方接受")) {
            Assertions.fail("添加好友之后显示信息不准确");
        }
    }

    @Order(1)
    @Test
    public void addFriendTest() {
        loginWith2();
        // 设置隐式等待 3s
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        // 添加 lisi 为好友
        addLisi();

        // lisi 搜索 zhangsan 结果: 无
        webDriver2.findElement(By.cssSelector("#inputBox")).sendKeys("zhangsan", Keys.ENTER);
        WebElement lisiUl = webDriver2.findElement(By.cssSelector("#add-friend"));
        List<WebElement> lisiLiList = lisiUl.findElements(By.tagName("li"));

        // 如果发现里面有 zhangsan 测试不通过
        for (int i = 1; i <= lisiLiList.size(); i++) {
            String name = ((JavascriptExecutor) webDriver).executeScript(
                    "return document.querySelector(\"#add-friend > li:nth-child(" + i + ") > h4\").innerText;"
            ).toString();

            if (name.equals("zhangsan")) {
                System.out.println("测试不通过");
                Assertions.fail("zhangsan 向 lisi 发送好友申请的时候 lisi 仍然能搜索到 zhangsan");
            }
        }


        // 这时 lisi 打开好友请求列表
        webDriver2.findElement(By
                        .cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend-req"))
                .click();
        // 拒绝 zhangsan 的申请
        webDriver2.findElement(By.cssSelector("#friend-req > li > div > div > button.reject-btn")).click();

        // zhanhsan 再次搜索 lisi 发送好友申请
        addLisi();

        // lisi 添加 zhangsan 为好友
        webDriver2.findElement(By.cssSelector("#friend-req > li > div > div > button.accept-btn")).click();

        // 查看两方的会话列表 结果: 都发现对方的会话
        // 点击会话列表页面
        webDriver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session")).click();
        webDriver2.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session")).click();

        // 获取会话列表
        WebElement zhangsanSessionListUL =
                webDriver.findElement(By.cssSelector("#session-list"));
        WebElement lisiSessionListUL =
                webDriver2.findElement(By.cssSelector("#session-list"));
        List<WebElement> zhangsanSessionListLi =
                zhangsanSessionListUL.findElements(By.tagName("li"));
        List<WebElement> lisiSessionListLi =
                lisiSessionListUL.findElements(By.tagName("li"));
        // 遍历会话列表, 查看是否有对方
        boolean zhangsanFlg = false;
        boolean lisiFlg = false;
        for (WebElement li : zhangsanSessionListLi) {
            String name = li.findElement(By.tagName("h3")).getText();
            if (name.equals("lisi")) {
                System.out.println("zhangsan 会话列表中有 lisi");
                zhangsanFlg = true;
            }
        }
        for (WebElement li : lisiSessionListLi) {
            String name = li.findElement(By.tagName("h3")).getText();
            if (name.equals("zhangsan")) {
                System.out.println("lisi 会话列表中有 zhangsan");
                lisiFlg = true;
            }
        }
        if (!zhangsanFlg) {
            System.out.println("测试不通过");
            Assertions.fail("zhangsan 的会话列表中没有 lisi");
        }
        if (!lisiFlg) {
            System.out.println("测试不通过");
            Assertions.fail("lisi 的会话列表中没有 zhangsan");
        }

        // 同样的, 遍历好友列表
        // 点击好友列表
        webDriver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend")).click();
        webDriver2.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend")).click();

        // 获取好友列表
        WebElement zhangsanFriendListUL =
                webDriver.findElement(By.cssSelector("#friend-list"));
        WebElement lisiFriendListUL =
                webDriver2.findElement(By.cssSelector("#friend-list"));
        List<WebElement> zhangsanFriendListLi =
                zhangsanFriendListUL.findElements(By.tagName("li"));
        List<WebElement> lisiFriendListLi =
                lisiFriendListUL.findElements(By.tagName("li"));
        // 遍历好友列表, 查看是否有对方
        zhangsanFlg = false;
        lisiFlg = false;
        for (WebElement li : zhangsanFriendListLi) {
            String name = li.findElement(By.tagName("h4")).getText();
            if (name.equals("lisi")) {
                System.out.println("zhangsan 好友列表中有 lisi");
                zhangsanFlg = true;
            }
        }
        for (WebElement li : lisiFriendListLi) {
            String name = li.findElement(By.tagName("h4")).getText();
            if (name.equals("zhangsan")) {
                System.out.println("lisi 好友列表中有 zhangsan");
                lisiFlg = true;
            }
        }
        if (!zhangsanFlg) {
            System.out.println("测试不通过");
            Assertions.fail("zhangsan 的好友列表中没有 lisi");
        }
        if (!lisiFlg) {
            System.out.println("测试不通过");
            Assertions.fail("lisi 的好友列表中没有 zhangsan");
        }

        // zhangsan 再次搜索 lisi
        webDriver.findElement(By.cssSelector("#inputBox")).sendKeys("lisi", Keys.ENTER);

        WebElement ul = webDriver.findElement(By.cssSelector("#add-friend"));
        List<WebElement> liList = ul.findElements(By.tagName("li"));
        // 先使用 js 将列表改为可见
        ((JavascriptExecutor) webDriver).executeScript(
                "document.querySelector(\"#add-friend\").className = 'list'"
        );

        for (WebElement li : liList) {
            // 找到 li 下 <h4> 中的名字为 lisi
            String name = li.findElement(By.tagName("h4")).getText();
            if (name.equals("lisi")) {
                // 找到 h3 标签, 应该为: 已添加好友
                String info = li.findElement(By.tagName("h3")).getText();
                if (!info.equals("已添加好友")) {
                    System.out.println("测试不通过");
                    Assertions.fail("已经添加 lisi 为好友时搜索 lisi 显示的状态不准确");
                }
                break;
            }
        }


        System.out.println("测试通过!");

    }
}
